/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.liquidByte.trafficMustang.server.business;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.liquidByte.trafficMustang.server.dataModel.Usuario;
import org.liquidByte.trafficMustang.server.repository.UsuarioRepository;
import org.liquidByte.trafficMustang.server.services.*;

/**
 *
 * @author Alexandre
 */
@Stateless
public class LoginBO implements LoginService {
    
    private static final Logger logger = Logger.getLogger(LoginBO.class.getName());
    
    @EJB
    private UsuarioRepository repository;
    @EJB
    private TrechoService trechoService;
    @EJB
    private DeslocamentoService deslocamentoService;

    public void autenticar(String docIdent, String senha) throws BusinessException {
        Usuario usuario = this.repository.getByDocIdent(docIdent);
        try {
            String md5hash = null;
            if (usuario != null) {
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                md5.update(senha.getBytes());
                md5hash = "";
                
                for (byte item : md5.digest()) {
                    md5hash += Integer.toHexString(0xFF & item);
                }
            }

            if (usuario == null || !md5hash.equals(usuario.getSenha())) {
                throw new BusinessException("Senha/Usuário inválido");
            }
            
            PerfilUsuario perfil;
            
            if (usuario.getMotorista() != null && this.deslocamentoService.existePendencia(usuario.getMotorista())) {
                BusinessContext.create(usuario.getUsrId(), PerfilUsuario.MOTORISTA);
            } else if (usuario.getPassageiro() != null && this.trechoService.existePendencia(usuario.getPassageiro())) {
                BusinessContext.create(usuario.getUsrId(), PerfilUsuario.PASSAGEIRO);
            } else if (usuario.getMotorista() != null) {
                BusinessContext.create(usuario.getUsrId(), PerfilUsuario.MOTORISTA);
            } else if (usuario.getPassageiro() != null) {
                BusinessContext.create(usuario.getUsrId(), PerfilUsuario.PASSAGEIRO);
            } else {
                BusinessContext.create(usuario.getUsrId());
            }
        } catch (NoSuchAlgorithmException ex) {
            logger.log(Level.SEVERE, null, ex);
            throw new BusinessException("Algoritmo de hash MD5 não foi identificado", ex);
        }
    }

    public Usuario getUsuario() {
        BusinessContext ctx = BusinessContext.getInstance();
        if (ctx == null) {
            return null;
        } else {
            return this.repository.getById(ctx.getIdUsuario());
        }
    }

    public PerfilUsuario getPerfilUsuario() {
        BusinessContext ctx = BusinessContext.getInstance();
        if (ctx == null) {
            return null;
        } else {
            return ctx.getPerfil();
        }
    }

    public void setPerfilUsuario(PerfilUsuario perfil) {
        BusinessContext ctx = BusinessContext.getInstance();
        if (ctx != null) {
            ctx.setPerfil(perfil);
        }
    }
}
